package top.metaspace.io.mynio;

import java.io.IOException;
import java.net.InetSocketAddress;
import java.nio.ByteBuffer;
import java.nio.channels.SelectionKey;
import java.nio.channels.Selector;
import java.nio.channels.SocketChannel;
import java.util.Iterator;
import java.util.Set;

/**
 * @author panjun
 * @date 2018/6/28.
 */
public class NioClient {

	Selector selector;
	SocketChannel sc;

	public static void main(String[] args) throws IOException {
		NioClient client = new NioClient();
		client.init();

	}

	public void init() throws IOException {
		selector = Selector.open();
		sc = SocketChannel.open();
		sc.configureBlocking(false);
		sc.register(selector, SelectionKey.OP_CONNECT);

		if(sc.connect(new InetSocketAddress("127.0.0.1",9000))){
			//直接发送数据
			sc.register(selector,SelectionKey.OP_READ);
			doWrite(sc,"大家好，我是客户端某某某，我做的测试是为了发生拆包做，不知道行不行，先试试吧，用大量的数据先堆满大家好，我是客户端某某某，我做的测试是为了发生拆包做，不知道行不行，先试试吧，用大量的数据先堆满大家好，我是客户端某某某，我做的测试是为了发生拆包做，不知道行不行，先试试吧，用大量的数据先堆满大家好，我是客户端某某某，我做的测试是为了发生拆包做，不知道行不行，先试试吧，用大量的数据先堆满大家好，我是客户端某某某，我做的测试是为了发生拆包做，不知道行不行，先试试吧，用大量的数据先堆满大家好，我是客户端某某某，我做的测试是为了发生拆包做，不知道行不行，先试试吧，用大量的数据先堆满"
					+ "大家好，我是客户端某某某，我做的测试是为了发生拆包做，不知道行不行，先试试吧，用大量的数据先堆满大家好，我是客户端某某某，我做的测试是为了发生拆包做，不知道行不行，先试试吧，用大量的数据先堆满大家好，我是客户端某某某，我做的测试是为了发生拆包做，不知道行不行，先试试吧，用大量的数据先堆满"
					+ "大家好，我是客户端某某某，我做的测试是为了发生拆包做，不知道行不行，先试试吧，用大量的数据先堆满大家好，我是客户端某某某，我做的测试是为了发生拆包做，不知道行不行，先试试吧，用大量的数据先堆满"
					+ "大家好，我是客户端某某某，我做的测试是为了发生拆包做，不知道行不行，先试试吧，用大量的数据先堆满"
					+ "大家好，我是客户端某某某，我做的测试是为了发生拆包做，不知道行不行，先试试吧，用大量的数据先堆满"
					+ "大家好，我是客户端某某某，我做的测试是为了发生拆包做，不知道行不行，先试试吧，用大量的数据先堆满"
					+ "大家好，我是客户端某某某，我做的测试是为了发生拆包做，不知道行不行，先试试吧，用大量的数据先堆满"
					+ "大家好，我是客户端某某某，我做的测试是为了发生拆包做，不知道行不行，先试试吧，用大量的数据先堆满"
					+ "大家好，我是客户端某某某，我做的测试是为了发生拆包做，不知道行不行，先试试吧，用大量的数据先堆满"
					+ "大家好，我是客户端某某某，我做的测试是为了发生拆包做，不知道行不行，先试试吧，用大量的数据先堆满"
					+ "大家好，我是客户端某某某，我做的测试是为了发生拆包做，不知道行不行，先试试吧，用大量的数据先堆满大家好，我是客户端某某某，我做的测试是为了发生拆包做，不知道行不行，先试试吧，用大量的数据先堆满"
					+ "大家好，我是客户端某某某，我做的测试是为了发生拆包做，不知道行不行，先试试吧，用大量的数据先堆满"
					+ "大家好，我是客户端某某某，我做的测试是为了发生拆包做，不知道行不行，先试试吧，用大量的数据先堆满"
					+ "大家好，我是客户端某某某，我做的测试是为了发生拆包做，不知道行不行，先试试吧，用大量的数据先堆满"
					+ "大家好，我是客户端某某某，我做的测试是为了发生拆包做，不知道行不行，先试试吧，用大量的数据先堆满"
					+ "大家好，我是客户端某某某，我做的测试是为了发生拆包做，不知道行不行，先试试吧，用大量的数据先堆满"
					+ "大家好，我是客户端某某某，我做的测试是为了发生拆包做，不知道行不行，先试试吧，用大量的数据先堆满大家好，我是客户端某某某，我做的测试是为了发生拆包做，不知道行不行，先试试吧，用大量的数据先堆满大家好，我是客户端某某某，我做的测试是为了发生拆包做，不知道行不行，先试试吧，用大量的数据先堆满"
					+ "大家好，我是客户端某某某，我做的测试是为了发生拆包做，不知道行不行，先试试吧，用大量的数据先堆满"
					+ "大家好，我是客户端某某某，我做的测试是为了发生拆包做，不知道行不行，先试试吧，用大量的数据先堆满大家好，我是客户端某某某，我做的测试是为了发生拆包做，不知道行不行，先试试吧，用大量的数据先堆满"
					+ "大家好，我是客户端某某某，我做的测试是为了发生拆包做，不知道行不行，先试试吧，用大量的数据先堆满"
					+ "大家好，我是客户端某某某，我做的测试是为了发生拆包做，不知道行不行，先试试吧，用大量的数据先堆满"
					+ "大家好，我是客户端某某某，我做的测试是为了发生拆包做，不知道行不行，先试试吧，用大量的数据先堆满大家好，我是客户端某某某，我做的测试是为了发生拆包做，不知道行不行，先试试吧，用大量的数据先堆满"
					+ "大家好，我是客户端某某某，我做的测试是为了发生拆包做，不知道行不行，先试试吧，用大量的数据先堆满大家好，我是客户端某某某，我做的测试是为了发生拆包做，不知道行不行，先试试吧，用大量的数据先堆满"
					+ "大家好，我是客户端某某某，我做的测试是为了发生拆包做，不知道行不行，先试试吧，用大量的数据先堆满"
					+ "大家好，我是客户端某某某，我做的测试是为了发生拆包做，不知道行不行，先试试吧，用大量的数据先堆满大家好，我是客户端某某某，我做的测试是为了发生拆包做，不知道行不行，先试试吧，用大量的数据先堆满大家好，我是客户端某某某，我做的测试是为了发生拆包做，不知道行不行，先试试吧，用大量的数据先堆满"
					+ "大家好，我是客户端某某某，我做的测试是为了发生拆包做，不知道行不行，先试试吧，用大量的数据先堆满"
					+ "大家好，我是客户端某某某，我做的测试是为了发生拆包做，不知道行不行，先试试吧，用大量的数据先堆满大家好，我是客户端某某某，我做的测试是为了发生拆包做，不知道行不行，先试试吧，用大量的数据先堆满"
					+ "大家好，我是客户端某某某，我做的测试是为了发生拆包做，不知道行不行，先试试吧，用大量的数据先堆满大家好，我是客户端某某某，我做的测试是为了发生拆包做，不知道行不行，先试试吧，用大量的数据先堆满"
					+ "大家好，我是客户端某某某，我做的测试是为了发生拆包做，不知道行不行，先试试吧，用大量的数据先堆满"
					+ "大家好，我是客户端某某某，我做的测试是为了发生拆包做，不知道行不行，先试试吧，用大量的数据先堆满"
					+ "大家好，我是客户端某某某，我做的测试是为了发生拆包做，不知道行不行，先试试吧，用大量的数据先堆满"
					+ "大家好，我是客户端某某某，我做的测试是为了发生拆包做，不知道行不行，先试试吧，用大量的数据先堆满"
					+ "大家好，我是客户端某某某，我做的测试是为了发生拆包做，不知道行不行，先试试吧，用大量的数据先堆满"
					+ "大家好，我是客户端某某某，我做的测试是为了发生拆包做，不知道行不行，先试试吧，用大量的数据先堆满"
					+ "大家好，我是客户端某某某，我做的测试是为了发生拆包做，不知道行不行，先试试吧，用大量的数据先堆满"
					+ "大家好，我是客户端某某某，我做的测试是为了发生拆包做，不知道行不行，先试试吧，用大量的数据先堆满"
					+ "大家好，我是客户端某某某，我做的测试是为了发生拆包做，不知道行不行，先试试吧，用大量的数据先堆满"
					+ "大家好，我是客户端某某某，我做的测试是为了发生拆包做，不知道行不行，先试试吧，用大量的数据先堆满"
					+ "大家好，我是客户端某某某，我做的测试是为了发生拆包做，不知道行不行，先试试吧，用大量的数据先堆满"
					+ "大家好，我是客户端某某某，我做的测试是为了发生拆包做，不知道行不行，先试试吧，用大量的数据先堆满"
					+ "大家好，我是客户端某某某，我做的测试是为了发生拆包做，不知道行不行，先试试吧，用大量的数据先堆满"
					+ "大家好，我是客户端某某某，我做的测试是为了发生拆包做，不知道行不行，先试试吧，用大量的数据先堆满"
					+ "大家好，我是客户端某某某，我做的测试是为了发生拆包做，不知道行不行，先试试吧，用大量的数据先堆满");
//			doWrite(sc,"hello");
//			doWrite(sc,"world");

		}else {
			sc.register(selector,SelectionKey.OP_CONNECT);
		}



		while (true) {
			selector.select();
			Set<SelectionKey> keys = selector.selectedKeys();
			Iterator<SelectionKey> it = keys.iterator();
			while (it.hasNext()){
				SelectionKey key = it.next();
				it.remove();
				if(key.isConnectable()){
					SocketChannel scl = (SocketChannel) key.channel();
					if(scl.finishConnect()){
						//完成连接
						scl.register(selector,SelectionKey.OP_READ);
						doWrite(scl,"大家好，我是客户端某某某，我做的测试是为了发生拆包做，不知道行不行，先试试吧，用大量的数据先堆满大家好，我是客户端某某某，我做的测试是为了发生拆包做，不知道行不行，先试试吧，用大量的数据先堆满大家好，我是客户端某某某，我做的测试是为了发生拆包做，不知道行不行，先试试吧，用大量的数据先堆满大家好，我是客户端某某某，我做的测试是为了发生拆包做，不知道行不行，先试试吧，用大量的数据先堆满大家好，我是客户端某某某，我做的测试是为了发生拆包做，不知道行不行，先试试吧，用大量的数据先堆满大家好，我是客户端某某某，我做的测试是为了发生拆包做，不知道行不行，先试试吧，用大量的数据先堆满"
								+ "大家好，我是客户端某某某，我做的测试是为了发生拆包做，不知道行不行，先试试吧，用大量的数据先堆满大家好，我是客户端某某某，我做的测试是为了发生拆包做，不知道行不行，先试试吧，用大量的数据先堆满大家好，我是客户端某某某，我做的测试是为了发生拆包做，不知道行不行，先试试吧，用大量的数据先堆满"
								+ "大家好，我是客户端某某某，我做的测试是为了发生拆包做，不知道行不行，先试试吧，用大量的数据先堆满大家好，我是客户端某某某，我做的测试是为了发生拆包做，不知道行不行，先试试吧，用大量的数据先堆满"
								+ "大家好，我是客户端某某某，我做的测试是为了发生拆包做，不知道行不行，先试试吧，用大量的数据先堆满"
								+ "大家好，我是客户端某某某，我做的测试是为了发生拆包做，不知道行不行，先试试吧，用大量的数据先堆满"
								+ "大家好，我是客户端某某某，我做的测试是为了发生拆包做，不知道行不行，先试试吧，用大量的数据先堆满"
								+ "大家好，我是客户端某某某，我做的测试是为了发生拆包做，不知道行不行，先试试吧，用大量的数据先堆满"
								+ "大家好，我是客户端某某某，我做的测试是为了发生拆包做，不知道行不行，先试试吧，用大量的数据先堆满"
								+ "大家好，我是客户端某某某，我做的测试是为了发生拆包做，不知道行不行，先试试吧，用大量的数据先堆满"
								+ "大家好，我是客户端某某某，我做的测试是为了发生拆包做，不知道行不行，先试试吧，用大量的数据先堆满"
								+ "大家好，我是客户端某某某，我做的测试是为了发生拆包做，不知道行不行，先试试吧，用大量的数据先堆满大家好，我是客户端某某某，我做的测试是为了发生拆包做，不知道行不行，先试试吧，用大量的数据先堆满"
								+ "大家好，我是客户端某某某，我做的测试是为了发生拆包做，不知道行不行，先试试吧，用大量的数据先堆满"
								+ "大家好，我是客户端某某某，我做的测试是为了发生拆包做，不知道行不行，先试试吧，用大量的数据先堆满"
								+ "大家好，我是客户端某某某，我做的测试是为了发生拆包做，不知道行不行，先试试吧，用大量的数据先堆满"
								+ "大家好，我是客户端某某某，我做的测试是为了发生拆包做，不知道行不行，先试试吧，用大量的数据先堆满"
								+ "大家好，我是客户端某某某，我做的测试是为了发生拆包做，不知道行不行，先试试吧，用大量的数据先堆满"
								+ "大家好，我是客户端某某某，我做的测试是为了发生拆包做，不知道行不行，先试试吧，用大量的数据先堆满大家好，我是客户端某某某，我做的测试是为了发生拆包做，不知道行不行，先试试吧，用大量的数据先堆满大家好，我是客户端某某某，我做的测试是为了发生拆包做，不知道行不行，先试试吧，用大量的数据先堆满"
								+ "大家好，我是客户端某某某，我做的测试是为了发生拆包做，不知道行不行，先试试吧，用大量的数据先堆满"
								+ "大家好，我是客户端某某某，我做的测试是为了发生拆包做，不知道行不行，先试试吧，用大量的数据先堆满大家好，我是客户端某某某，我做的测试是为了发生拆包做，不知道行不行，先试试吧，用大量的数据先堆满"
								+ "大家好，我是客户端某某某，我做的测试是为了发生拆包做，不知道行不行，先试试吧，用大量的数据先堆满"
								+ "大家好，我是客户端某某某，我做的测试是为了发生拆包做，不知道行不行，先试试吧，用大量的数据先堆满"
								+ "大家好，我是客户端某某某，我做的测试是为了发生拆包做，不知道行不行，先试试吧，用大量的数据先堆满大家好，我是客户端某某某，我做的测试是为了发生拆包做，不知道行不行，先试试吧，用大量的数据先堆满"
								+ "大家好，我是客户端某某某，我做的测试是为了发生拆包做，不知道行不行，先试试吧，用大量的数据先堆满大家好，我是客户端某某某，我做的测试是为了发生拆包做，不知道行不行，先试试吧，用大量的数据先堆满"
								+ "大家好，我是客户端某某某，我做的测试是为了发生拆包做，不知道行不行，先试试吧，用大量的数据先堆满"
								+ "大家好，我是客户端某某某，我做的测试是为了发生拆包做，不知道行不行，先试试吧，用大量的数据先堆满大家好，我是客户端某某某，我做的测试是为了发生拆包做，不知道行不行，先试试吧，用大量的数据先堆满大家好，我是客户端某某某，我做的测试是为了发生拆包做，不知道行不行，先试试吧，用大量的数据先堆满"
								+ "大家好，我是客户端某某某，我做的测试是为了发生拆包做，不知道行不行，先试试吧，用大量的数据先堆满"
								+ "大家好，我是客户端某某某，我做的测试是为了发生拆包做，不知道行不行，先试试吧，用大量的数据先堆满大家好，我是客户端某某某，我做的测试是为了发生拆包做，不知道行不行，先试试吧，用大量的数据先堆满"
								+ "大家好，我是客户端某某某，我做的测试是为了发生拆包做，不知道行不行，先试试吧，用大量的数据先堆满大家好，我是客户端某某某，我做的测试是为了发生拆包做，不知道行不行，先试试吧，用大量的数据先堆满"
								+ "大家好，我是客户端某某某，我做的测试是为了发生拆包做，不知道行不行，先试试吧，用大量的数据先堆满"
								+ "大家好，我是客户端某某某，我做的测试是为了发生拆包做，不知道行不行，先试试吧，用大量的数据先堆满"
								+ "大家好，我是客户端某某某，我做的测试是为了发生拆包做，不知道行不行，先试试吧，用大量的数据先堆满"
								+ "大家好，我是客户端某某某，我做的测试是为了发生拆包做，不知道行不行，先试试吧，用大量的数据先堆满"
								+ "大家好，我是客户端某某某，我做的测试是为了发生拆包做，不知道行不行，先试试吧，用大量的数据先堆满"
								+ "大家好，我是客户端某某某，我做的测试是为了发生拆包做，不知道行不行，先试试吧，用大量的数据先堆满"
								+ "大家好，我是客户端某某某，我做的测试是为了发生拆包做，不知道行不行，先试试吧，用大量的数据先堆满"
								+ "大家好，我是客户端某某某，我做的测试是为了发生拆包做，不知道行不行，先试试吧，用大量的数据先堆满"
								+ "大家好，我是客户端某某某，我做的测试是为了发生拆包做，不知道行不行，先试试吧，用大量的数据先堆满"
								+ "大家好，我是客户端某某某，我做的测试是为了发生拆包做，不知道行不行，先试试吧，用大量的数据先堆满"
								+ "大家好，我是客户端某某某，我做的测试是为了发生拆包做，不知道行不行，先试试吧，用大量的数据先堆满"
								+ "大家好，我是客户端某某某，我做的测试是为了发生拆包做，不知道行不行，先试试吧，用大量的数据先堆满"
								+ "大家好，我是客户端某某某，我做的测试是为了发生拆包做，不知道行不行，先试试吧，用大量的数据先堆满"
								+ "大家好，我是客户端某某某，我做的测试是为了发生拆包做，不知道行不行，先试试吧，用大量的数据先堆满"
								+ "大家好，我是客户端某某某，我做的测试是为了发生拆包做，不知道行不行，先试试吧，用大量的数据先堆满");

//						doWrite(sc,"hello");
//						doWrite(sc,"world");

					}

				}else if(key.isReadable()){
					//服务端返回的数据读取
				}
			}
		}
	}
	private  void doWrite(SocketChannel sc,String data) throws IOException{
		System.out.println("写数据....");
		byte[] req =data.getBytes();
		ByteBuffer byteBuffer = ByteBuffer.allocate(req.length);
		byteBuffer.put(req);
		byteBuffer.flip();
		sc.write(byteBuffer);
		if(!byteBuffer.hasRemaining()){
			System.out.println("Send 2 client successed");
		}
	}

}
